Mask AMD CPUID masks in software before writing them to the MSRs
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 17 Feb 2010 12:05:45 +0000 (12:05 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 17 Feb 2010 12:05:45 +0000 (12:05 +0000)
Mask AMD CPUID masks in software before writing them to the MSRs.
Setting bits in the CPUID mask MSR that are not set in the unmasked
CPUID response can cause those bits to be set in the masked response.
Avoid that by explicitly masking in software.

Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
xen/arch/x86/cpu/amd.c

index 94f35770e5bd986bd4e9fa77979edf6a02da0ed2..aabfd4c9ba542750b2d1ecc90a2d18f245c435c5 100644 (file)
@@ -130,6 +130,14 @@ static void __devinit set_cpuidmask(struct cpuinfo_x86 *c)
                return;
        }
 
+        /* Setting bits in the CPUID mask MSR that are not set in the
+         * unmasked CPUID response can cause those bits to be set in the
+         * masked response.  Avoid that by explicitly masking in software. */
+        feat_ecx &= cpuid_ecx(0x00000001);
+        feat_edx &= cpuid_edx(0x00000001);
+        extfeat_ecx &= cpuid_ecx(0x80000001);
+        extfeat_edx &= cpuid_edx(0x80000001);
+
        status = set_mask;
        printk("Writing CPUID feature mask ECX:EDX -> %08Xh:%08Xh\n", 
               feat_ecx, feat_edx);